# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/9 11:46 
@Author  : ZhangShenao 
@File    : compare.py 
@Desc    : 对象的比较

在Python中,==和is是两种常见的对象比较方式
==：比较对象的值是否相等
is：比较对象的身份是否相等,即是否指向同一个对象,底层是判断两个对象的id()是否相同

通常情况下,我们只关心对象的值是否相等,因此大多数情况下都使用==进行判断
但是,当我们比较一个变量与一个单例(singleton)时,通常会使用is,一个典型的例子就是检查一个变量是否为None

比较操作符is的速度效率通常要优于==
因为is操作符不能被重载,这样Python就不需要去寻找程序中是否有其他地方重载了比较操作符,再去调用
执行比较操作符is仅仅是比较两个变量的ID

==运算符可以通过__eq__()函数进行重载,以实现自定义的比较逻辑


"""

a = 257
b = 257
print(f'a == b? {a == b}')  # a == b? True

# 通过内置的id()函数,可以获取对象的唯一标识
print(f'a_id = {id(a)}, b_id = {id(b)}')
print(f'a is b? {a is b}')  # a is b? True

# 通常情况下,我们只关心对象的值是否相等,因此大多数情况下都使用==进行判断
# 但是,当我们比较一个变量与一个单例(singleton)时,通常会使用is,一个典型的例子就是检查一个变量是否为None
print(f'a is None? {a is None}')  # a is None? False

# 即使对于Immutable的对象,==或is的比较结果也是可能发生改变的
# 例如,对于tuple,虽然它本身是Immutable的,但是它内部也可以存储list,而list是可变的
t1 = (1, 2, [3, 4])
t2 = (1, 2, [3, 4])
print(f't1 == t2? {t1 == t2}')  # t1 == t2? True
t1[2].append(5)
print(f't1 == t2? {t1 == t2}')  # t1 == t2? False
